package com.jdk.learn.juc._01volidate;

/**
 * Created by bgt on 2018/1/30.
 * 内存可见性问题
 * 访问共享数据问题
 *
 * volidate关键字：
 * 当多个线程访问共享数据时，可以保证内存中的数据的可见性。
 * 相较于synchronized是一种较为轻量级的同步策略
 *
 * 注意：
 *      volidate不具备互斥性
 *      不保证变量的原子性
 */
public class TestVolidate {

    public static void main(String[] args) {
        ThreadDemo td=new ThreadDemo();
        new Thread(td).start();
        while (true){
            //方案2
//            synchronized (td) {
                if (td.isFlag()) {//我能停止掉吗？能break吗？
                    System.out.println("---------------------------我是main");
                    break;
                }
//            }
        }
    }
}

class ThreadDemo implements Runnable{

    //原始共享数据
    private boolean flag=false;
    //解决方案1
//    private volatile boolean  flag=false;
    @Override
    public void run() {
        try {
            Thread.sleep(200);//休眠200毫秒
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        flag=true;
        System.out.println("我是run中的flag："+isFlag());
    }

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }
}
